/*
 * StructureDTD.h
 *
 *  Created on: 22 mars 2011
 *      Author: lgu
 */

#ifndef STRUCTUREDTD_H_
#define STRUCTUREDTD_H_



#include <string>
#include <vector>
#include <list>

#include <fstream>

using namespace std;

//Entite = base
class DTDEntite
{
protected:

public:
	DTDEntite();
	bool isElement();
	bool isEnsemble();
	virtual ~DTDEntite();
	virtual string getAffichage();
};

//AppEntite = Entite + cardinalite
class AppEntite
{
private:
	DTDEntite* contenuAppEntite;
	int typeCardinalite;
		//type de cardinalite:
		//	0: pas de cardinalite
		//	1: _PLUS(+)
		//	2: _AST(*)
		//	3: _QMARK(?)

public:
	AppEntite();
	AppEntite(DTDEntite*, int);

	DTDEntite* getContenu();
	int getTypeCard();

	string getAffichage();
	int verifierStructure(const vector<string>&, unsigned int&);


};


class DTDElement : public DTDEntite
{
private:
	string name;

public:
	DTDElement();
	DTDElement(string);
	virtual ~DTDElement();
	string getName();

	virtual string getAffichage();
};


class DTDEnsemble : public DTDEntite
{
private:
	vector<AppEntite> sousEntites;
	vector<int> relations;
		//type de relation:
		//	0 : seg sed
		//	1 : seg,sed
		//	2 : seg|sed
		//	3?

public:
	DTDEnsemble();
	DTDEnsemble(vector<AppEntite>,vector<int>);
	virtual ~DTDEnsemble();
	void ajouterEntite(AppEntite, int);

	vector<AppEntite> getEntites();
	vector<int> getRelations();

	virtual string getAffichage();
};



//===================================================
class DTDPhrase
{
protected:

public:
	DTDPhrase();
	bool isElement();
	bool isAttlist();
	virtual ~DTDPhrase();


};


class DTDPhraseElement : public DTDPhrase
{
private:
	DTDElement elementCorr;
	int typeRelationCorr;
		//type de relationCorr:
		//	0 : un DTDEnsemble normal
		//	1 : _EMPTY
		//	2 : _ANY
		//	3 : PCDATA
		//	4 : CDATA

	AppEntite ensembleCorr;

public:
	DTDPhraseElement();
	DTDPhraseElement(DTDElement, int);
	virtual ~DTDPhraseElement();
	bool ajouterEnsemble(DTDEnsemble, int);

	DTDElement getElementCorr();
	int getTypeRelationCorr();
	AppEntite getEnsembleCorr();
	string getAffichage();

	int verifierStructure(const vector<string>&);

};

class DTDPhraseAttlist : public DTDPhrase
{
private:
	vector<string> nomAttlist;
	int typeCorr;
		//type de relationCorr:
		//	0 : pas defini
		//	1 : PCDATA
		//	2 : CDATA
	int typeImplied;
		//type de relationCorr:
		//	0 : pas defini
		//	1 : IMPLIED
		//	2 :

public:
	DTDPhraseAttlist();
	DTDPhraseAttlist(vector<string>, int, int);
	virtual ~DTDPhraseAttlist();

	string getAffichage();

};


//========================================================
//========================================================

class StructureEntiteDTD
{
private:
	vector<DTDPhrase*> contenu;

public:
	StructureEntiteDTD();
	void ajouterPhrase(DTDPhrase*);

	vector<string> getAffichage();
	DTDPhraseElement* getElement(string);

};

#endif
